// 引入router中的index.js文件，写导航守卫
import router from '@/router'
import store from '@/store'
router.beforeEach(async(to, from, next) => {
  const whiteList = ['/login', '/404']
  //   判断页面是否在白名单中、
  // 在白名单：放行 next()
  // 不在白名单：跳到login页面

  if (store.getters.token) {
    // 有token值，且页面在login，那么就跳转到首页
    if (to.path === '/login') {
      next('/')
    } else {
      // 后台每个页面都需要获取到用户的资料
      // 获取用户资料的时机就是这里
      // 有token，但又不是去login页的时候
      // 每次进入只拿一遍数据, 之后的跳转就不再发请求(每跳转一个页面，都会发送一次请求)
      // 这个时候，我们需要判断一下，如果我们已经获取过了数据，就不用再发送请求了
      // 根据用户的id来进行判断，不能直接判断userInfo是否是空对象
      // 空对象的布尔值永远都是true
      if (!store.state.user.userInfo.userId) {
        // 在用户数据中，结构出拥有用户权限的roles对象，这里如果要拿数据的话，需要在user模块中return用户数据
        const { roles } = await store.dispatch('user/getUserInfo')
        // 权限对象就是roles的menus
        // console.log(roles.menus)
        // 调用permission模块中的过滤路由方法，把用户拥有的权限数组传递到这个方法中，进行路由筛选，需要在filterRoute方法中返回数据，在这里接收
        const routes = await store.dispatch('permission/filterRouter', roles.menus)
        // 将当前用户有权限的页面重新加入路由配置
        router.addRoutes([...routes, { path: '*', redirect: '/404', hidden: true }])
        // 添加路由，添加的时间点会晚于匹配路由过程，因为没有添加路由呢，所以输入的地址就没有可去的页面，那么就会白屏，所以我们需要在添加完路由之后，需要在当前的目的地路径中原地跳一次，重新触发匹配过程，去想去的页面，那么这个时候已经根据用户的信息来加载好了所有的路由，所以就会跳到对应的页面
        next(to.path)
      } else {
        next()
      }
    }
  } else {
    // 在白名单
    if (whiteList.includes(to.path)) {
      next()
    } else {
    // 不在白名单
    // 判断有无token值
    // 有token值，放行
      next('/login')
    }
  }
})
export default router
